<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
<head>
  <link href="//gmpg.org/xfn/11" rel="profile">
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="Hugo 0.68.3" />

  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>自定义过滤器 &middot; 我的博客</title>

  
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/print.css" media="print">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/poole.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/syntax.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/hyde.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril+Fatface|PT+Sans:400,400i,700">


  
  <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png">
  <link rel="shortcut icon" href="/favicon.png">

  
  
</head>

  <body class="theme-base-0b ">
  <aside class="sidebar">
  <div class="container sidebar-sticky">
    <div class="sidebar-about">
      <a href="/my_technology_blog/"><h1>我的博客</h1></a>
      <p class="lead">
       杨博的博客 
      </p>
    </div>

    <nav>
      <ul class="sidebar-nav">
        <li><a href="/my_technology_blog/">Home</a> </li>
        
      </ul>
    </nav>

    <p>&copy; 2021. All rights reserved. </p>
  </div>
</aside>

    <main class="content container">
    <div class="post">
  <h1>自定义过滤器</h1>
  <time datetime=2020-04-08T15:13:00&#43;0800 class="post-date">Wed, Apr 8, 2020</time>
  <ol>
<li>
<p>随意一个子应用中创建一个包文件夹templatetags（templatetags文件夹中包含init.py文件）。</p>
</li>
<li>
<p>在templatetags中创建自定义到py文件。</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code> from django.template import Library
 register = Library()

    
 @register.filter('percent_decimal')
 def percent_decimal(value):
     value = str(value) + &quot;元&quot;
     return value
</code></pre>
</li>
<li>
<p>模板中使用自定义过滤器</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
</li>
</ol>
<p>自定义标签</p>
<p>什么是模板标签（标签）</p>
<p>模板标签都是放在{％}}括号里的，常见的模板标签有{％loadxxxx％}，{％blockxxxx％}，{％ifxxx％}，{％url&rsquo;xxxx&rsquo;％}。这些模板标签的本质也是函数，标签名一般即为函数名。这些标签的主要作用包括载入代码渲染模板或对传递过来的参数进行一定的逻辑判断或计算后返回。</p>
<p>自定义标签相对于自定义过滤器来说要复杂很多，因为自定义标签可以做任何事情！</p>
<ul>
<li>自定义标签分为很多类型</li>
</ul>
<ol>
<li>
<p>简单标签  Simple tags</p>
<!-- raw HTML omitted -->
<p>from django.template import Library
from datetime import datetime</p>
<p>register = Library()</p>
<p>@register.simple_tag
def current_time(format_str):
return datetime.now().strftime(format_str)</p>
</li>
</ol>
<ul>
<li>
<p>Library.simple_tag(takes_context=True)  takes_context=True参数可以让我们访问模板的当前环境上下文，即将当前环境上下文中的参数和值作为字典传入函数中的一个名为context的参数</p>
<!-- raw HTML omitted -->
<p>from django.template import Library
from datetime import datetime</p>
<p>register = Library()</p>
<p>@register.filter(&lsquo;myfilter&rsquo;)
def myfilter(value):
<!-- raw HTML omitted -->
value = &ldquo;<!-- raw HTML omitted -->&rdquo; + str(value) + &ldquo;元<!-- raw HTML omitted -->&rdquo;
return value</p>
<!-- raw HTML omitted -->
<p>@register.simple_tag(name='aaa&rsquo;)
def current_time(format_str):
return datetime.now().strftime(format_str)</p>
<p>@register.simple_tag(takes_context=True)
def this_time(context, format_str):
return datetime.strptime(context[&lsquo;time&rsquo;], &lsquo;%Y-%m-%d %H:%M:%S&rsquo;).strftime(format_str)</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
</li>
</ul>
<ol start="2">
<li>内含标签  Inclusion tags</li>
</ol>
<p>这种类型的标签可以被其他模板进行渲染，然后将渲染结果输出
Library.inclusion_tag()支持take_context=True，用法类似Library.simple_tag()</p>
<pre><code>&lt;!-- # 包含标签 --&gt;
@register.inclusion_tag('list.html')
def mylist():
    return {'list': [1,2,3,4,5,6]}

{% mylist %}
</code></pre>
<ol start="3">
<li>分配标签  Assignment tags</li>
</ol>
<p>类似于简单标签，但并不会输出结果，可以使用 as 关键字将结果赋给一个参数。</p>
<pre><code>{% aaa '%Y-%m-%d %H:%M:%S' as t %}
{{ t }}
</code></pre>
<hr>
<p>自定义过滤器，配置方法</p>
<ol>
<li>
<p>在一个&quot;子应用&quot;目录下建立templatetags文件 夹
建立 my_filter.py文件</p>
<p>from django import template
register = template.Library()</p>
<p>@register.filter
def my_str(val):
return &ldquo;$&quot;+str(val)</p>
</li>
<li>
<p>在setting.py文件中TEMPLATES中的OPTIONS中加入</p>
<p>&lsquo;libraries&rsquo;:{
&lsquo;my_filter&rsquo;:  &lsquo;web.templatetags.my_filter&rsquo;,
<!-- raw HTML omitted -->
}</p>
</li>
<li>
<p>在模板中调用</p>
<p>{% load my_filter %}
{{name|my_str}}</p>
</li>
</ol>

</div>


    </main>

    
  </body>
</html>
